package eva.savant.business.contabilidad.view

import eva.savant.business.contabilidad.service.TSContabilidad
import eva.savant.businessobject.cg.*
import eva.savant.businessobject.gl.*
import eva.savant.core.view.Bean

import javax.faces.convert.Converter
import org.primefaces.event.SelectEvent

public class TCuenta extends Bean {

  def lsTipo, tipo

  Date dateIni, dateEnd

  DocumentoDetalle detail

  public void clean(String tipo) { // si es venta no puede modificar cabecera

    dateIni = dateEnd =  new Date()

    entity= new Documento(); init()

    entity.creacion= new Date()

    entity.vencimiento= new Date()

    entity.persona= new Persona()

    entity.tipo = tipo

    entity.estado= 'N'

    entity.lsDocumentoDetalle= new ArrayList<DocumentoDetalle>()


    detail= new DocumentoDetalle()

    detail.tipo = new Tipo()

    detail.fecha= new Date()


    this.tipo= tipo

    lsTipo= find(Tipo,'clase.id=?',sociedad.id + 'MP')
  }

  public List findLsEntity() {

    dateIni= toStartDay(dateIni); dateEnd= toMidnight(dateEnd);

    return find(Documento,'tipo like ? and creacion between ? and ? order by id desc','%'+tipo+'%', dateIni, dateEnd)
  }

  public void editEntity(Object id) {

    entity= get(Documento, id)
  }

  public boolean mergeEntity(Object entity) { alta((Documento)entity); entity= (Documento) entity

    if(entity.estado.equals('C')) throw new Exception ('El documento ya fue cancelado')

    entity.estado = entity.saldo <= 0? 'C' : entity.saldo < entity.importe? 'P' : 'N'

    def tsContabilidad= (TSContabilidad) getSpringBean('tsContabilidad')

    return tsContabilidad.saveDocumento(entity) != null
  }

  public void detailAdd() {

    if(detail.referencia?.length() < 1) { addErrorMessage 'El documento de referencia es invalido'; return }

    if(detail.importe <= 0) { addErrorMessage 'El monto debe ser mayor a cero'; return }


    detail.cajero= get(Cajero,'usuario.id=?',usuario.id)

    if(detail.cajero == null) addErrorMessage 'El usuario no es un cajero'


    def d= new DocumentoDetalle()

    d.tipo= get(Tipo,detail.tipo.id)

    d.fecha= detail.fecha

    d.cajero= detail.cajero

    d.importe= detail.importe

    d.referencia= detail.referencia

    d.descripcion= detail.descripcion


    detailDelete(d)

    entity.lsDocumentoDetalle.add d

    calculateSummary()


    detail= new DocumentoDetalle()

    detail.cajero= new Cajero()

    detail.tipo = new Tipo()

    detail.fecha= d.fecha
  }

  public void detailEdit(SelectEvent event) {

    if(isRead) return

    def x= (DocumentoDetalle) event.object

    detail= new DocumentoDetalle()

    detail.tipo= x.tipo

    detail.fecha= x.fecha

    detail.importe= x.importe

    detail.referencia= x.referencia

    detail.descripcion= x.descripcion
  }

  public void detailDelete(DocumentoDetalle detail) {

    for(int i=0; i < entity.lsDocumentoDetalle.size(); i++)  {

    def x= entity.lsDocumentoDetalle.get(i)

    if(x.referencia.equalsIgnoreCase(detail.referencia))

    {  entity.lsDocumentoDetalle.remove(i); break }  }

    calculateSummary()
  }

  public void calculateSummary() {

    def suma= 0, date= null; for(x in entity.lsDocumentoDetalle) { suma= suma + x.importe

    date= date == null? x.fecha : x.fecha > date? x.fecha : date }


    entity.saldo= entity.importe - suma; entity.ultimopago= date
  }

  public List complete(String value) { return completeLike(Persona,'nombre',value) }

  public Converter getConverter() { return converterLike(Persona) }

}